home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio / Ham Radio CD-ROM (Emerald Software) (1995).ISO / misc / 9q920411 / ipsock.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-04-11  |  3.0 KB  |  166 lines

  1. #include "global.h"
  2. #include "mbuf.h"
  3. #include "ip.h"
  4. #include "usock.h"
  5. #include "socket.h"
  6.  
  7. static void rip_recv __ARGS((struct raw_ip *rp));
  8. static void autobind __ARGS((struct usock *up));
  9.  
  10. int
  11. so_ip_sock(up,protocol)
  12. struct usock *up;
  13. int protocol;
  14. {
  15.     int s;
  16.  
  17.     s = up - Usock + SOCKBASE;
  18.     up->cb.rip = raw_ip(protocol,rip_recv);
  19.     up->cb.rip->user = s;
  20.     return 0;
  21. }
  22. int
  23. so_ip_conn(up)
  24. struct usock *up;
  25. {
  26.     if(up->name == NULLCHAR)
  27.         autobind(up);
  28.     return 0;
  29. }
  30. int
  31. so_ip_recv(up,bpp,from,fromlen)
  32. struct usock *up;
  33. struct mbuf **bpp;
  34. char *from;
  35. int *fromlen;
  36. {
  37.     struct raw_ip *rip;
  38.     struct sockaddr_in *remote;
  39.     struct ip ip;
  40.     int cnt;
  41.  
  42.     while((rip = up->cb.rip) != NULLRIP && rip->rcvq == NULLBUF){
  43.         if(up->noblock){
  44.             errno = EWOULDBLOCK;
  45.             return -1;
  46.         } else if((errno = pwait(up)) != 0){
  47.             return -1;
  48.         }
  49.     }
  50.     if(rip == NULLRIP){
  51.         /* Connection went away */
  52.         errno = ENOTCONN;
  53.         return -1;
  54.     }
  55.     *bpp = dequeue(&rip->rcvq);
  56.     ntohip(&ip,bpp);
  57.  
  58.     cnt = len_p(*bpp);
  59.     if(from != NULLCHAR && fromlen != (int *)NULL && *fromlen >= SOCKSIZE){
  60.         remote = (struct sockaddr_in *)from;
  61.         remote->sin_family = AF_INET;
  62.         remote->sin_addr.s_addr = ip.source;
  63.         remote->sin_port = 0;
  64.         *fromlen = SOCKSIZE;
  65.     }
  66.     return cnt;
  67. }
  68. int
  69. so_ip_send(up,bp,to)
  70. struct usock *up;
  71. struct mbuf *bp;
  72. char *to;
  73. {
  74.     struct sockaddr_in *local,*remote;
  75.  
  76.     if(up->name == NULLCHAR)
  77.         autobind(up);
  78.     local = (struct sockaddr_in *)up->name;
  79.     if(to != NULLCHAR){
  80.         remote = (struct sockaddr_in *)to;
  81.     } else if(up->peername != NULLCHAR) {
  82.         remote = (struct sockaddr_in *)up->peername;
  83.     } else {
  84.         free_p(bp);
  85.         errno = ENOTCONN;
  86.         return -1;
  87.     }    
  88.     ip_send(local->sin_addr.s_addr,remote->sin_addr.s_addr,
  89.         (char)up->cb.rip->protocol,0,0,bp,0,0,0);
  90.     return 0;
  91. }
  92. int
  93. so_ip_qlen(up,rtx)
  94. struct usock *up;
  95. int rtx;
  96. {
  97.     int len;
  98.  
  99.     switch(rtx){    
  100.     case 0:
  101.         len = len_q(up->cb.rip->rcvq);
  102.         break;
  103.     case 1:
  104.         len = 0;        
  105.         break;
  106.     }
  107.     return len;
  108. }
  109. int
  110. so_ip_close(up)
  111. struct usock *up;
  112. {
  113.     del_ip(up->cb.rip);
  114.     return 0;
  115. }
  116. int
  117. checkipaddr(name,namelen)
  118. char *name;
  119. int namelen;
  120. {
  121.     struct sockaddr_in *sock;
  122.  
  123.     sock = (struct sockaddr_in *)name;
  124.     if(sock->sin_family != AF_INET || namelen != sizeof(struct sockaddr_in))
  125.         return -1;
  126.     return 0;
  127. }
  128.  
  129. /* Raw IP receive upcall routine */
  130. static void
  131. rip_recv(rp)
  132. struct raw_ip *rp;
  133. {
  134.     psignal(itop(rp->user),1);
  135.     pwait(NULL);
  136. }
  137. /* Issue an automatic bind of a local address */
  138. static void
  139. autobind(up)
  140. struct usock *up;
  141. {
  142.     struct sockaddr_in local;
  143.     int s;
  144.  
  145.     s = up - Usock + SOCKBASE;
  146.     local.sin_family = AF_INET;
  147.     local.sin_addr.s_addr = INADDR_ANY;
  148.     local.sin_port = Lport++;
  149.     bind(s,(char *)&local,sizeof(struct sockaddr_in));
  150. }
  151. char *
  152. ippsocket(p)
  153. struct sockaddr *p;
  154. {
  155.     struct sockaddr_in *sp;
  156.     struct socket socket;
  157.     static char buf[30];
  158.  
  159.     sp = (struct sockaddr_in *)p;
  160.     socket.address = sp->sin_addr.s_addr;
  161.     socket.port = sp->sin_port;
  162.     strcpy(buf,pinet(&socket));
  163.  
  164.     return buf;
  165. }
  166.